﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ImageProcessingLib
{
    /// <summary>
    /// Базовый класс для всех эффектов.
    /// </summary>
    abstract class AbstractImageEffect
    {
        #region === members ===

        protected BitmapInfo4 _bitmapInfo;

        #endregion

        #region === protected methods ===

        protected int GetPixel(int x, int y)
        {
            int xv = x;
            int yv = y;

            if (xv < 0) xv = 0;
            if (xv >= _bitmapInfo.Width) xv = _bitmapInfo.Width - 1;

            if (yv < 0) yv = 0;
            if (yv >= _bitmapInfo.Height) yv = _bitmapInfo.Height - 1;

            int line = _bitmapInfo.Stride / 4;

            return _bitmapInfo.ImageArray4[yv * line + xv];
        }

        #endregion

        /// <summary>
        /// Применяет эффект к цвету.
        /// </summary>
        /// <param name="color">Цвет.</param>
        /// <returns>Новое значение цвета.</returns>
        protected abstract int PixelEffect(int index);

        /// <summary>
        /// Применить эффект и вывести результат в массив с заданным диапазоном.
        /// </summary>
        /// <param name="destinationImArray">Массив цветов для записи результата.</param>
        /// <param name="startIndex">Начальный индекс.</param>
        /// <param name="endIndex">Конечный индекс.</param>
        public void ApplyEffect(int[] destinationImArray, int startIndex, int endIndex)
        {
            for (int i = startIndex; i <= endIndex; i++)
            {
                destinationImArray[i] = PixelEffect(i);
            }
        }
    }
}
